* Key combinations must be in a format that can be parsed by
* gtk_accelerator_parse().
*
+ * Returns: %G_TOKEN_NONE if the signal was successfully parsed and added,
+ * the expected token otherwise
+ *
* Since: 3.0
- **/
-void
+ */
+GTokenType
gtk_binding_entry_add_signal_from_string (GtkBindingSet *binding_set,
- const gchar *signal_desc)
+ const gchar *signal_desc)
{
static GScanner *scanner = NULL;
GTokenType ret;
- g_return_if_fail (binding_set != NULL);
- g_return_if_fail (signal_desc != NULL);
+ g_return_val_if_fail (binding_set != NULL, G_TOKEN_NONE);
+ g_return_val_if_fail (signal_desc != NULL, G_TOKEN_NONE);
if (G_UNLIKELY (!scanner))
scanner = create_signal_scanner ();
ret = gtk_binding_parse_bind (scanner, binding_set);
- if (ret != G_TOKEN_NONE)
- g_scanner_unexp_token (scanner, ret, NULL, NULL, NULL,
- "Could not parse binding", FALSE);
-
/* Reset for next use */
g_scanner_set_scope (scanner, 0);
+
+ return ret;
}
/**
const gchar *signal_name,
GSList *binding_args);
-void gtk_binding_entry_add_signal_from_string (GtkBindingSet *binding_set,
- const gchar *signal_desc);
+GTokenType gtk_binding_entry_add_signal_from_string (GtkBindingSet *binding_set,
+ const gchar *signal_desc);
void gtk_binding_entry_remove (GtkBindingSet *binding_set,
guint keyval,
SCOPE_PSEUDO_CLASS,
SCOPE_NTH_CHILD,
SCOPE_DECLARATION,
- SCOPE_VALUE
+ SCOPE_VALUE,
+ SCOPE_BINDING_SET
};
/* Extend GtkStateType, since these
g_scanner_set_scope (scanner, scope);
if (scope == SCOPE_VALUE)
+ {
+ scanner->config->cset_identifier_first = G_CSET_a_2_z G_CSET_A_2_Z G_CSET_DIGITS "@#-_";
+ scanner->config->cset_identifier_nth = G_CSET_a_2_z G_CSET_A_2_Z G_CSET_DIGITS "@#-_ +(),.%\t\n'/\"";
+ scanner->config->scan_identifier_1char = TRUE;
+ }
+ else if (scope == SCOPE_BINDING_SET)
{
scanner->config->cset_identifier_first = G_CSET_a_2_z G_CSET_A_2_Z G_CSET_DIGITS "@#-_";
scanner->config->cset_identifier_nth = G_CSET_a_2_z G_CSET_A_2_Z G_CSET_DIGITS "@#-_ +(){}<>,.%\t\n'/\"";
if (scanner->token != G_TOKEN_LEFT_CURLY)
return G_TOKEN_LEFT_CURLY;
- css_provider_push_scope (css_provider, SCOPE_VALUE);
+ css_provider_push_scope (css_provider, SCOPE_BINDING_SET);
g_scanner_get_next_token (scanner);
do
{
+ GTokenType ret;
+
if (scanner->token != G_TOKEN_IDENTIFIER)
{
scanner->user_data = "Binding definition";
return G_TOKEN_IDENTIFIER;
}
- gtk_binding_entry_add_signal_from_string (binding_set,
- scanner->value.v_identifier);
+ ret = gtk_binding_entry_add_signal_from_string (binding_set,
+ scanner->value.v_identifier);
+ if (ret != G_TOKEN_NONE)
+ {
+ scanner->user_data = "Binding definition";
+ return ret;
+ }
+
g_scanner_get_next_token (scanner);
if (scanner->token != ';')